package com.dd.cloud.user.service.doctor;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.dd.cloud.common.vo.PageVo;
import com.dd.cloud.user.entity.doctor.DoctorIntegral;
import com.dd.cloud.user.entity.doctor.DoctorUser;
import com.dd.cloud.user.req.doctor.*;
import com.dd.cloud.user.res.admin.StatisticalUserNumRes;
import com.dd.cloud.user.res.doctor.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;

/**
 * <p>
 * 医生账号信息表  服务类
 * </p>
 *
 * @author czg
 * @since 2022-04-27
 */
public interface IDoctorUserService extends IService<DoctorUser> {
    /**
     * 医生通过手机验证码登录
     *
     * @param phone 手机
     * @param code  验证码
     * @return 医生账号信息
     */
    DoctorUser doctorLoginByPhone(HttpServletRequest request, HttpServletResponse response, String phone, String code, String model, String platId, String appId, Integer type, String cid);

    /**
     * 修改医生状态
     *
     * @param doctorId
     * @param status
     */
    void updateDoctorUserStatusById(Integer doctorId, Integer status);

    /**
     * 医生通过账号密码登录
     *
     * @param phone 手机
     * @param psw   密码
     * @return 医生账号信息
     */
    DoctorUser doctorLoginByAccount(HttpServletRequest request, HttpServletResponse response, String phone, String psw, String model, String platId, String appId, Integer type, String cid);

    /**
     * 医生忘记密码
     *
     * @param phone
     * @param code
     * @param pwd
     * @param pwds
     */
    void doctorForgetPwd(String phone, String code, String pwd, String pwds);

    /**
     * 机构添加医生
     *
     * @param req
     * @return
     */
    void addDoctorUser(DoctorCreateReq req);

    /**
     * excel批量添加医生
     *
     * @param file
     */
    DoctorExcelRes addDoctorBatchByExcel(MultipartFile file);

    /**
     * 运营添加医生 通过EXCEL文档
     *
     * @param file
     * @return
     */
    DoctorExcelRes adminAddDoctorUserByExcel(MultipartFile file);

    /**
     * 机构添加医生 通过EXCEL文档
     *
     * @param file
     * @return
     */
    DoctorExcelRes mechanAddDoctorUserByExcel(MultipartFile file);

    /**
     * 医生修改密码
     *
     * @param id 医生ID
     * @param op 原密码
     * @param np 新密码
     * @return 无
     */
    void changePassword(Integer id, String op, String np);

    /**
     * 医生找回密码
     *
     * @param mobileNumber 手机号
     * @param code         手机验证码
     * @param np           新密码
     * @param cp           确认新密码
     * @return 无
     */
    void findPassword(String mobileNumber, String code, String np, String cp, HttpServletRequest request);

    /**
     * 设置密码
     *
     * @param password
     * @param passwords
     */
    void setPassWord(String password, String passwords);

    /**
     * 修改医生状态
     *
     * @param id 医生id
     * @param status         状态
     * @return 无
     */
    //void updateStatus(Integer id, Integer status);

    /**
     * 效验医生状态
     *
     * @param doctorUser
     */
    void switchStatus(DoctorUser doctorUser);

    /**
     * 查询医生列表后台
     *
     * @param req
     * @return
     */
    IPage<DoctorSysListRes> queryDoctorListSys(DoctorSysListReq req);

    /**
     * 导出医生列表后台
     *
     * @param req
     * @param response
     */
    void exportDoctorUserSystemExcel(DoctorSysListReq req, HttpServletResponse response);

    /**
     * 查询医生邀请名单列表
     *
     * @param req
     * @return
     */
    IPage<DoctorInvitePageRes> queryDoctorInvitePage(DoctorInvitePageReq req);

    /**
     * 重置医生密码
     *
     * @param doctorId
     */
    void resetDoctorPwd(Integer doctorId);

    /**
     * 查看账号是否存在
     *
     * @param phone
     * @param type
     * @return
     */
    boolean checkPhoneUser(String phone, Integer type);

    /**
     * 查询openid通过code
     *
     * @param code
     * @return
     */
    String queryOpenidByCode(String code);

    /**
     * 注册医生账号
     *
     * @param request
     * @param response
     * @param req
     */
    void registryDoctorUser(HttpServletRequest request, HttpServletResponse response, DoctorRegistryReq req);

    /**
     * 修改医生账号信息 内部service使用
     *
     * @param du
     */
    void updateDoctorUser(DoctorUser du);

    /**
     * 初始化医生邀请码
     */
    void initDoctorUserInviteCode();

    /**
     * 获取医生账号类型
     *
     * @param docId
     * @return
     */
    Integer getDoctorUserType(Integer docId);

    /**
     * 获取医生账号机构id
     *
     * @param docId
     * @return
     */
    Integer getDoctorUserMechanId(Integer docId);

    /**
     * 获取医生名称
     *
     * @param docId
     * @return
     */
    String getDoctorUserName(Integer docId);

    /**
     * 获取医生手机号
     *
     * @param docId
     * @return
     */
    String getDoctorUserPhone(Integer docId);

    /**
     * 获取医生医疗机构
     *
     * @param docId
     * @return
     */
    String getDoctorUserOrganization(Integer docId);

    /**
     * 获取医生账号处方权情况
     *
     * @param docId
     * @return
     */
    Integer getDoctorUserPresPower(Integer docId);

    /**
     * 查询医生处方权权限业务数据
     *
     * @param docId
     * @return
     */
    DoctorUserPresBoRes queryDoctorUserPresPowerBoRes(Integer docId);

    /**
     * 数据兼容处理
     */
    void updateMechanName();

    /**
     * 修改医生账号类型
     *
     * @param doctorId
     * @param type
     */
    void updateDoctorUserType(Integer doctorId, Integer type);

    /**
     * 医生账号注销
     *
     * @param request
     * @param phone
     * @param code
     */
    void doctorUserAccountLogoff(HttpServletRequest request, String phone, String code);

    /**
     * 医生注销列表
     *
     * @param req
     * @return DoctorSysListRes
     */
    IPage<DoctorSysListRes> getLogoOffPage(DoctorSysListReq req);

    /**
     * 开启关闭处方权
     *
     * @param doctorId
     * @param status
     */
    void updatePresPower(Integer doctorId, Integer status);

    /**
     * 医生开通处方审方业务
     *
     * @param open
     */
    void openDoctorUserPresReviewBo(Integer open);

    /**
     * 查询可签约审方医生列表
     *
     * @param req
     * @return
     */
    IPage<CanSingingDoctorListRes> queryCanSingingDoctorList(CanSingingDoctorPageReq req);

    /**
     * 处理医生认证失效
     */
    void doctorAuthLapse();

    /**
     * 处理医生认证失效消息通知
     */
    void doctorAuthLapseNewsNotice();

    void test();

    /**
     * 修改更新app版本赠送未认证使用免费次数版本号
     *
     * @param freeAiVersion
     */
    void updateFreeAiVersion(String freeAiVersion);

    /**
     * 修改功能引导,科室引导
     *
     * @param functionGuide
     * @param depGuide
     */
    void updateFunctionGuideOrDepGuide(String functionGuide, String depGuide);

    /**
     * 扫码登录 存储二维码时间戳
     *
     * @param timestamp
     */
    void loginScanSaveTime(String timestamp);

    /**
     * 是否登录
     *
     * @param timestamp
     */
    DoctorQrScanReq doctorScanIsLogin(String timestamp);

    /**
     * 点击授权
     *
     * @param status
     * @param timestamp
     */
    void doctorScanQrClick(Integer status, String timestamp);

    /**
     * 扫码登录
     *
     * @param doctorId
     * @param response
     * @param request
     */
    DoctorUser doctorScanLogin(Integer doctorId, HttpServletRequest request, HttpServletResponse response, String timestamp);

    /**
     * 扫码登录 删除二维码时间戳
     *
     * @param timestamp
     */
    void deleteDoctorQr(String timestamp);

    /**
     * 查询医生患者数量及订单数量
     *
     * @return
     */
    StatisticalUserNumRes getStatisticalUserNum();

    /**
     * 各个时间维度医生收益统计
     *
     * @param req
     * @return
     */
    List<DoctorStatisticalNodeRes> getStatisticalDateNode(DoctorStatisticalNodeReq req);

    /**
     * 统计医生处方数量
     *
     * @param req
     * @return
     */
    List<DoctorStatisticalNodeRes> getStatisticalDoctorPresNumNode(DoctorStatisticalNodeReq req);

    /**
     * 查询医生积分(分页)
     *
     * @param req
     * @return
     */
    PageVo<DoctorIntegral> queryDoctorIntegralPage(DoctorIntegralPageReq req);

    /**
     * 查询赠送次数
     *
     * @param accountAuth
     * @param accountType
     * @param doctorId
     * @return
     */
    void savePresenterNum(Integer accountType, Integer accountAuth, Integer doctorId);

    /**
     * 医生认证情况短信
     *
     * @param doctorId
     */
    void doctorUserAuthSms(Integer doctorId);

    /**
     * 获取私聊id
     *
     * @return
     */
    Integer queryWebSocketGroupId();
}
